]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
status/network: Use submenus when necessary
authorFlorian Müllner <fmuellner@gnome.org>
Tue, 2 Aug 2022 23:23:29 +0000 (01:23 +0200)
committerMarge Bot <marge-bot@gnome.org>
Wed, 10 Aug 2022 12:17:19 +0000 (12:17 +0000)
We currently stopped using submenus altogether, but that only works

 - if there is a single connection that represents
   the device as a whole

 - if there is just one device, so it is unambiguous
   what device items belong to

To implement that behavior, add a 'single-device-mode' property that
NMDeviceSection can set on its items, and have items update their
'use-submenu' property based on that.

For wireless devices it's a straight mapping, as its items represent
wireless networks that can appear and disappear by just walking around
(multiple wifi adapters also sounds rather fringey).

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2407>

js/ui/status/network.js

index 8f5cf20669e2f65c6b9f5f9813f1fa827638675e..5405c7aa07d0c9efcea354e663f3fccea55c2789 100644 (file)
@@ -379,8 +379,13 @@ const NMDeviceConnectionItem = GObject.registerClass({
     }
 });
 
-const NMDeviceItem = GObject.registerClass(
-class NMDeviceItem extends NMSectionItem {
+const NMDeviceItem = GObject.registerClass({
+    Properties: {
+        'single-device-mode': GObject.ParamSpec.boolean('single-device-mode', '', '',
+            GObject.ParamFlags.READWRITE,
+            false),
+    },
+}, class NMDeviceItem extends NMSectionItem {
     constructor(client, device) {
         super();
 
@@ -419,6 +424,8 @@ class NMDeviceItem extends NMSectionItem {
             'notify::active-connection', () => this._activeConnectionChanged(),
             this);
 
+        this.connect('notify::single-device-mode', () => this._sync());
+
         this._syncConnections();
         this._activeConnectionChanged();
     }
@@ -526,6 +533,7 @@ class NMDeviceItem extends NMSectionItem {
     _sync() {
         const nItems = this._connectionItems.size;
         this.radio_mode = nItems > 1;
+        this.useSubmenu = this.radioMode && !this.singleDeviceMode;
         this._autoConnectItem.visible = nItems === 0;
         this._deactivateItem.visible = this.radioMode && this.isActive;
     }
@@ -959,8 +967,13 @@ class NMWirelessNetworkItem extends PopupMenu.PopupBaseMenuItem {
     }
 });
 
-const NMWirelessDeviceItem = GObject.registerClass(
-class NMWirelessDeviceItem extends NMSectionItem {
+const NMWirelessDeviceItem = GObject.registerClass({
+    Properties: {
+        'single-device-mode': GObject.ParamSpec.boolean('single-device-mode', '', '',
+            GObject.ParamFlags.READWRITE,
+            false),
+    },
+}, class NMWirelessDeviceItem extends NMSectionItem {
     constructor(client, device) {
         super();
 
@@ -996,6 +1009,10 @@ class NMWirelessDeviceItem extends NMSectionItem {
                 this._updateItemsVisibility();
             }, this);
 
+        this.bind_property('single-device-mode',
+            this, 'use-submenu',
+            GObject.BindingFlags.INVERT_BOOLEAN);
+
         Main.sessionMode.connectObject('updated',
             () => this._updateItemsVisibility(),
             this);
@@ -1534,6 +1551,9 @@ class NMDeviceSection extends NMSection {
     _sync() {
         super._sync();
 
+        const nItems = this._items.size;
+        this._items.forEach(item => (item.singleDeviceMode = nItems === 1));
+
         let nDevices = this._itemsSection.box.get_children().reduce(
             (prev, child) => prev + (child.visible ? 1 : 0), 0);
         this._summaryItem.label.text = this._getSummaryLabel(nDevices);